#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "touch.h"
#include "main.h"
#define TOUCH_PATH "/dev/input/event0"

int x = -1, y = -1; 
int slide_dir; // 1上   2下     3左   4右
int touch_fd;

int touch_init(){
        //1.打开触摸屏文件
    touch_fd = open(TOUCH_PATH, O_RDONLY);
    if (-1 == touch_fd)
    {
        perror("open /dev/input/event0 fail");
        return -1;
    }
    return 0;
}

void touch_uninit(){
    close(touch_fd);
}

/*
    get_touch_coord:获取点击屏幕的坐标(x,y)
    返回值：
        int
        成功 0
        失败 -1
// */
// void* get_touch_coord()
// {
//     while (1)
//     {
//         struct input_event ev;
//         int flag_x = 0 , flag_y = 0; //标识是否获取到了x， y，0(未获取)    1(获取到)

//         while(1)
//         {
//             //2.读取触摸屏文件的事件数据
//             int ret = read(touch_fd, &ev, sizeof(ev));
//             if (-1 == ret)
//             {
//                 perror("read /dev/input/event0 fail");
//                 //close(touch_fd);
//                 break;
//             }
//             if(ret != sizeof(ev)) //数据读取不完整
//             {
//                 break;
//             }


//             //3.解析读取到的数据
//             if(ev.type == EV_ABS && ev.code == ABS_X) 
//             {
//                 x = ev.value * (800 * 1.0 / 1024);
//                 flag_x = 1;
//             }
//             else if(ev.type == EV_ABS && ev.code == ABS_Y)
//             {
//                 y = ev.value * (480 * 1.0 / 600);
//                 flag_y = 1;
//             }

//             if (flag_x && flag_y)
//             {
//                 break;
//             }
//         }

//         printf("(%d,%d)\n", x, y);
//         //根据（x,y)改变mode
//         if(x < 400)
//         {
//             mode = 1;
//         }
//         else if(x > 600)
//         {
//             mode = 0;
//         }
//         else if(x> 400 && x < 600){
//             mode = 2;
//         }

//         //4.关闭触摸屏文件

//         sleep(1);
//     }
      
// }

// /*
//     get_slide_direction: 获取滑动方向
//     @返回值：
//         int 
//         成功 0
//         失败 -1
// */
// int get_slide_direction(void)
// {


//     struct input_event ev;
//     int x0 = -1, y0 = -1; //保存得到的起点(x0,y0)
//     int x1 = -1, y1 = -1; //保存得到的终点(x1,y1)
//     // while(1)
//     // {
//         //2.读取滑动时的输入事件的数据，直到手离开屏幕时结束读取
//         int ret = read(touch_fd, &ev, sizeof(ev));
//         if(-1 == ret)
//         {
//             perror("read /dev/input/event0 fail");
//             close(touch_fd);
//             return -1;
//         }
//         if(ret != sizeof(ev)) //数据读取不完整
//         {
//             return -1;
//         }

//         //3.解析读取的数据，获取value值, 得到(x0,y0)及(x1,y1)
//         if (ev.type == EV_ABS && ev.code == ABS_X)
//         {
//             if(x0 == -1)
//             {
//                 x0 = ev.value * (800*1./1024);
//             }
//             else 
//             {
//                 x1 = ev.value * (800*1./1024);
//             }
//         }
//         else if(ev.type == EV_ABS && ev.code == ABS_Y)
//         {
//             if (y0 == -1)
//             {
//                 y0 = ev.value * (480*1.0/600);
//             }
//             else 
//             {
//                 y1 = ev.value * (480*1.0/600);
//             }
//         }

//         // if (ev.type == EV_KEY && ev.code ==BTN_TOUCH && ev.value == 0) //手指松开了屏幕,结束获取
//         // {
//         //     break;
//         // }
//     //}
    
//     //4.根据起始坐标及终点坐标判断滑动方向
//     if(abs(y1-y0) > abs(x1-x0) && (y0>y1)) //上
//     {
//         slide_dir = UP;
//         return slide_dir;
//     }
//     else if(abs(y1-y0) > abs(x1-x0) && (y0<y1)) //下
//     {
//         slide_dir = DOWN;
//         return slide_dir;
//     }
//     else if(abs(y1-y0) < abs(x1-x0) && (x0>x1))//左
//     {
//         slide_dir = LEFT;
//         return slide_dir;
//     }
//     else if(abs(y1-y0) < abs(x1-x0) && (x0<x1)) //右
//     {
//         slide_dir = RIGHT;
//         return slide_dir;
//     }

//     //5.关闭屏幕文件

//     return 0;
// }

// void *get_coord_dirction(){
//     while (1)
//     {
//         //if()
//         get_slide_direction();
//         get_touch_coord();
//     }
    
// }

/*
    get_slide_direction_or_get_coord: 获取滑动方向/获取点击坐标
    @返回值：
        int 
        成功 0
        失败 -1
*/
int get_slide_direction_or_get_coord(void)
{
    //printf("get_slide_direction_or_get_coord\n");
    struct input_event ev;
    int x0 = -1, y0 = -1; //保存得到的起点(x0,y0)
    int x1 = -1, y1 = -1; //保存得到的终点(x1,y1)

    while(1)
    {
        //2.读取滑动时的输入事件的数据，直到手离开屏幕时结束读取
        int ret = read(touch_fd, &ev, sizeof(ev));
        if(ret != sizeof(ev)) //数据读取不完整
        {
            continue;
        }

        //3.解析读取的数据，获取value值, 得到(x0,y0)及(x1,y1)
        if (ev.type == EV_ABS && ev.code == ABS_X)
        {
            if(x0 == -1)
            {
                x0 = ev.value * (800*1.0/1024);
                x1 = ev.value * (800*1.0/1024);
            }
            else 
            {
                x1 = ev.value * (800*1.0/1024);
            }
        }
        if(ev.type == EV_ABS && ev.code == ABS_Y)
        {
            if (y0 == -1)
            {
                y0 = ev.value * (480*1.0/600);
                y1 = ev.value * (480*1.0/600);
            }
            else 
            {
                y1 = ev.value * (480*1.0/600);
            }
        }

        if (ev.type == EV_KEY && ev.code ==BTN_TOUCH && ev.value == 0) //手指松开了屏幕,结束获取
        {
            break;
        }
    }

    //4.根据起始坐标及终点坐标判断滑动方向
    if (abs(x0-x1)<25 && abs(y0-y1)<25) //点击
    {
        slide_dir = CLICK;
        //如果判断为点击，保存点击的(x,y)坐标
        x = x0;
        y = y0;

        printf("(%d,%d)\n", x, y);
        //根据（x,y)改变mode
    switch (mode)
    {
        case 0://home
        {
            if(x < 400)
            {
                mode = 1;
            }
            else if(x > 400)
            {
                mode = 2;
            } 
            break;
        }
        case 1://picture
        {
            if(x > 600){
                mode = 0;
                printf("-->0");
            }              
            //sleep(1);
            
        }
            break;
        case 2://monitor
        {
            if(x > 600){
                mode = 0;
                
            }  
            
        }
        break;
        default:
            break;
    }

    }
    else if(abs(y1-y0) > abs(x1-x0) && (y0 > y1)) //上
    {
        slide_dir = UP;
        printf("UP --- return home\n");
        mode = 0;
    }
    else if(abs(y1-y0) > abs(x1-x0) && (y0 < y1)) //下
    {
        slide_dir = DOWN;
        printf("DOWN\n");
    }
    else if(abs(y1-y0) < abs(x1-x0) && (x0 > x1))//左
    {
        slide_dir = LEFT;
        printf("LEFT\n");
    }
    else if(abs(y1-y0) < abs(x1-x0) && (x0 < x1)) //右
    {
        slide_dir = RIGHT;
        printf("RIGHT\n");
    }
    return 0;
}

void *get_direction_coord(void *arg)
{
    while(1)
    {
        get_slide_direction_or_get_coord();
        sleep(1);
    }
}
